home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / ov143b.zip / DATE.ASM < prev    next >
Assembly Source File  |  1993-01-04  |  4KB  |  151 lines

  1.         PAGE    60,132
  2.         TITLE   Routines to work with DOS dates
  3.  
  4. ; 001   13-Dec-86 date.asm
  5.  
  6. ;       Copyright (c) 1986 by Blue Sky Software.  All rights reserved.
  7.  
  8. _TEXT   SEGMENT  BYTE PUBLIC 'CODE'
  9. _TEXT   ENDS
  10. _DATA   SEGMENT  WORD PUBLIC 'DATA'
  11. _DATA   ENDS
  12. CONST   SEGMENT  WORD PUBLIC 'CONST'
  13. CONST   ENDS
  14. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  15. _BSS    ENDS
  16. DGROUP  GROUP   CONST,  _BSS,   _DATA
  17.         ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
  18.  
  19. _BSS    SEGMENT
  20. fmtbuf  DB 09H DUP (?)
  21.         EVEN
  22. _BSS    ENDS
  23.  
  24. _TEXT   SEGMENT
  25.  
  26. ;****************************************************************************
  27. ;
  28. ;  unsigned int
  29. ;  getdate()
  30. ;
  31. ;  Get current date in integer format.
  32. ;
  33. ;****************************************************************************
  34.  
  35.         PUBLIC  _getdate
  36.  
  37. _getdate PROC NEAR
  38.         push    bp
  39.         mov     bp,sp
  40.  
  41.         mov     ax,2a00h               ;get date function
  42.         int     21h
  43.  
  44.         mov     ax,cx                  ;return ( (cx - 1980) << 9) +
  45.         sub     ax,1980                ;         (dh << 5) + dl )
  46.         mov     cl,9
  47.         shl     ax,cl
  48.         mov     bx,ax
  49.  
  50.         mov     al,dh
  51.         sub     ah,ah
  52.         mov     cl,5
  53.         shl     ax,cl
  54.  
  55.         sub     dh,dh
  56.  
  57.         or      ax,bx
  58.         or      ax,dx
  59.  
  60.         mov     sp,bp
  61.         pop     bp
  62.         ret
  63.  
  64. _getdate        ENDP
  65.  
  66.  
  67. ;*****************************************************************************
  68. ;
  69. ;   char *
  70. ;   mmddyy(date)
  71. ;   unsigned int date;
  72. ;
  73. ;   Convert an integer date to MM/DD/YY format.
  74. ;
  75. ;*****************************************************************************
  76.  
  77.         PUBLIC  _mmddyy
  78.  
  79. _mmddyy PROC NEAR
  80.         push    bp
  81.         mov     bp,sp
  82.  
  83.         mov     bx,OFFSET DGROUP:fmtbuf
  84.  
  85.         mov     ax,[bp+4]              ;isolate month
  86.         and     ax,01e0h
  87.         mov     cl,5
  88.         shr     ax,cl
  89.  
  90.         mov     ah,' '                 ;cvt to ascii with blank fill
  91.         call    al2asc
  92.  
  93.         mov     BYTE PTR [bx],'/'      ;separator
  94.         inc     bx
  95.  
  96.         mov     ax,[bp+4]              ;isolate day
  97.         and     ax,001fh
  98.  
  99.         mov     ah,'0'                 ;cvt to ascii with 0 fill
  100.         call    al2asc
  101.  
  102.         mov     BYTE PTR [bx],'/'      ;separator
  103.         inc     bx
  104.  
  105.         mov     ax,[bp+4]              ;isolate year
  106.         and     ax,0fe00h
  107.         mov     cl,9
  108.         shr     ax,cl
  109.         add     ax,80                  ;offset from year 1980
  110.  
  111.         mov     ah,'0'                 ;cvt to ascii with 0 fill
  112.         call    al2asc
  113.  
  114.         mov     BYTE PTR [bx],0        ;terminate string
  115.  
  116.         mov     ax,OFFSET DGROUP:fmtbuf  ;tell caller where it is
  117.  
  118.         mov     sp,bp
  119.         pop     bp
  120.         ret
  121.  
  122. _mmddyy ENDP
  123.  
  124.  
  125. al2asc  PROC    NEAR                   ;cvt al to 2 ascii digits
  126.  
  127.         cmp     al,10                  ;is there a tens digit to cvt?
  128.         jae     dotens                 ;yes, go do it
  129.         mov     [bx],ah                ;no, store fill char
  130.         jmp     SHORT dounits
  131.  
  132. dotens: sub     cl,cl                  ;count the # tens
  133. cntens: inc     cl
  134.         sub     al,10
  135.         cmp     al,10
  136.         jae     cntens
  137.  
  138.         add     cl,'0'                 ;convert count to ascii
  139.         mov     [bx],cl                ;  and store
  140.  
  141. dounits: inc    bx                     ;move to the units digit
  142.         add     al,'0'                 ;convert units to ascii
  143.         mov     [bx],al                ;  and store
  144.  
  145.         inc     bx                     ;update for caller
  146.         ret
  147. al2asc  ENDP
  148.  
  149. _TEXT   ENDS
  150. END
  151.